1. Write the IDL interface (class) -> describe the data and methods the interface will provide (declares the API without any implementations) -> it may be added to a more general module (namespace) e.g. : create a file "example.idl" 2. Generate code file from the IDL interface -> builds up the files for client, server and implementation/servant (.cpp + .h) e.g. : run "tao_idl -GI example.idl" 3. Edit the implementation header file according to your needs e.g. : edit "exampleI.h" 4. Write the actual implementation for the implementation class -> define how each data is used and what each method does => define the servant e.g. edit "exampleI.cpp" UP TO THIS POINT AN OBJECT (e.g. called "example") HAS BEEN DEFINED BY THE EXAMPLE CLASS SPAWNED FROM THE IDL FILE (with all its behaviours) 5. Write the implementation for the SERVER -> create a local entity that will run on the server according to the definitions of the object defined above (e.g. the "example" object) -> the local implementation inherits the attributes defined in the object's header file (exampleI.h) e.g. : edit "exampleServer.cpp" a). initialize the ORB e.g. : " CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); " b). get a reference to the RootPOA (the POA deals with low-level issues such as reading requests, unmarshaling data, etc. in conjunction with the target machine where the CORBA Object is implemented; in the end is a collection of servants) e.g. : " CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); " c). activate the POAManager (it manages the requests made to RootPOA and its component POAs) e.g. : " PortableServer::POAManager_var mgr = poa->the_POAManager(); mgr->activate(); " d). create a servant (the actual local object that inherits the class definitions) e.g. : " PortableServer::Servant_var servant = new exampleI(); " e). register the servant with the RootPOA, obtain its object reference, stringify it, and write it to a file. e.g. : " PortableServer::ObjectId_var oid = poa->activate_object(servant.in()); obj = poa->id_to_reference(oid.in()); CORBA::String_var str = orb->object_to_string(obj.in()); ofstream iorFile("example.ior"); iorFile << str.in() << std::endl; iorFile.close(); " f). start the server and set up its destruction after running e.g. : " orb->run(); orb->destroy(); " 6. Write the implementation for the CLIENT -> it does not need any knowledge of the example implementation, all it inherits is the exampleC.h header file generated by the TAO IDL compiler out of the IDL file (the interface/class definition) e.g. : edit "exampleClient.cpp" a). initialize the ORB b). destringify the object's IOR and narrow it to the appropriate type e.g. : " CORBA::Object_var obj = orb->string_to_object("file://example.ior"); example_var example = example::_narrow(obj.in()); " c). add your client's implementation / behaviour 7. Create a workspace and a project manager & creator file -> (optional) specify a workspace containing multiple projects -> write the project creator file e.g. : "example.mwc" & "example.mpc" 8. Use mwc & mpc pearl scripts to generate the desired makefiles e.g. : "mpc.pl -type make example.mpc" 9. Make your makefiles e.g. : "make -f ... " 10. Run the server + client